#!/usr/bin/env python
# -*- coding: latin-1 -*-

import random

class Jugador(object):
	"""Clase Jugador. Atributos: nombre, descripción, autor, criaturas, puntaje"""
	def __init__(self,nombre,descripcion,autor,tipo):
		"""nombre, descripcion y autor son cadena de caracteres. criaturas una lista con las criaturas que posee el jugador, tipo una cadena que puede ser "real","artificial" o "artificial_inteligente" y puntaje es un numero """
		self.nombre=nombre
		self.descripcion=descripcion
		self.autor=autor
		self.criaturas=[]
		self.tipo=tipo 
		self.puntaje=0
		
	def agregar_criatura(self,criatura):
		"""Agrega una criatura a la lista de criaturas del jugador la cual se pasa por parametro """
		self.criaturas.append(criatura)
		
	def eliminar_criatura(self,criatura):
		"""Quita una criatura de la lista de criaturas del jugador la cual se pasa por parametro """
		self.criaturas.remove(criatura)
		
	def elegir_criatura(self):
		"""Devuelve la próxima criatura a utilizar en un combate, o bien 
		None si no tiene criaturas disponibles. Es la primera de la lista """
		if self.tipo=="real":
			print "Sus criaturas son: "
			for x in self.criaturas:
				if not x:
					return None
				print x.nombre
				print "Informacion de la criatura:"
				print "hp: ",x.hp,"\nmp: ",x.mp,"\nxp: ",x.xp,"\nfuerza: ",x.fuerza,"\ninteligencia: ",x.inteligencia,"\ncontextura: ",x.contextura,"\ndestreza: ",x.destreza,"\ncarisma: ",x.carisma,"\nsabiduria: ",x.sabiduria
			while True:
				criatura_elegir=raw_input("Ingrese el nombre de la criatura que desea elegir: ")
				criatura_elegida=None
				for x in self.criaturas:
					if str.lower(criatura_elegir)==x.nombre:
						criatura_elegida=x
				if criatura_elegida:
					break					
		else:
			if not self.criaturas: return None
			criatura_elegida=random.choice(self.criaturas)
		return criatura_elegida
		
	def elegir_accion(self,origen,destino):
		"""Devuelve el nombre de la habilidad a utilizar y la criatura 
		destino de la habilidad. En el caso de ser un jugador real, 
		interactúa con el usuario para decidirlo, en el caso de ser un 
		jugador artificial, evalúa programáticamente sus posibilidades y 
		elige una. Se pasa por parametro origen y destino que son criaturas """
		self.origen=origen
		lista_habilidades_origen=self.origen.obtener_habilidades().values()
		if self.tipo=="artificial_inteligente":
			while True:
				if len(lista_habilidades_origen)==0:
					return "ninguna",destino
				dic=destino.obtener_estado()
				minimo_estado=dic["hp"] 
				clave = ""
				for caract in dic.keys():
					if dic[caract]<minimo_estado:
						minimo_estado=dic[caract]
						clave=caract
				caracteristica_descartar=clave
				habilidad_elegida=None
				for habilidad in lista_habilidades_origen:
					dic_consecuencias_destino=habilidad.obtener_consecuencias(origen, destino)[1]
					for consecuencia in dic_consecuencias_destino.keys():
						if caracteristica_descartar==consecuencia and dic_consecuencias_destino[consecuencia]!=0:
							habilidad_elegida=habilidad
				#si ninguna habilidad tiene para atacar a la caracteristica hace un random
				if not habilidad_elegida:
					habilidad_elegida=random.choice(lista_habilidades_origen)	
				lista_habilidades_origen.remove(habilidad_elegida)
				costos=habilidad_elegida.obtener_costos()
				estado=origen.obtener_estado()
				for caract in costos.keys():
						if costos[caract]<=estado[caract]:
							return habilidad_elegida.nombre,destino
		elif self.tipo=="artificial":
			while True:
				habilidad=random.choice(lista_habilidades_origen)
				if not habilidad:
					return "ninguna",destino
				lista_habilidades_origen.remove(habilidad)
				print habilidad.nombre
				costos=habilidad.obtener_costos()
				estado=origen.obtener_estado()
				for caract in costos.keys():
					if costos[caract]<=estado[caract]:
						return habilidad.nombre,destino
		else:	
			while True:
				if len(lista_habilidades_origen)==0:
					return "ninguna",destino
				while True:
					print "Sus habilidades son:"
					for x in lista_habilidades_origen:
						print x.nombre
					print "si lo desea puede huir"
					nombre_habilidad=raw_input("\nQue habilidad desea utilizar?")
					a=0
					
					for x in origen.habilidades:
						if str.lower(nombre_habilidad)==x.nombre:
							habilidad=x
							a+=1
					if a:
						break
					else:
						print "Habilidad inválida"
				costos=habilidad.obtener_costos()
				estado=origen.obtener_estado()
				if str.lower(nombre_habilidad)=="huir":
					return nombre_habilidad,destino
				lista_habilidades_origen.remove(habilidad)
				for caract in costos.keys():
					if costos[caract]<=estado[caract]:
						return habilidad.nombre,destino

class JugadorAI(Jugador):
	def __init__(self):
		descripcion="Utiliza una estrategia para restarle todas las habilidades de a una, empezando por la que tiene menos puntaje"
		autor="JL Y AM"
		Jugador.__init__(self, "Lara-Markosich", descripcion, autor, "artificial_inteligente")


